home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
476-500
/
500
/
wiconify
/
wiconsetter.lzh
/
wIconSetter
/
Source
/
wIconCalls.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-04-19
|
15KB
|
729 lines
/*
* WICONIFY A utility that allows you to iconify any Intuition window
* on any screen, and to open WB windows on any screen.
*
* wIconCalls.c The programmer's interface to wIconify. This module
* handles the inter-process communication between
* wIconify and client programs.
*
* Copyright 1990 by Davide P. Cervone, all rights reserved.
* You may use this code, provided this copyright notice is kept intact.
*/
#define INTUITION_PREFERENCES_H /* don't need 'em */
#include <intuition/intuition.h>
#include "wStructs.h"
/*
* The version of wIconCalls.c
*/
#define MAJVERSION 1
#define MINVERSION 4
/*
* The expected version of wIconify itself
*/
#define MAJLIBVERS 3
#define MINLIBVERS 7
#define NEWICONIFY ((struct MsgPort *)-1)
static struct MsgPort *wIconPort; /* the wIconify message port */
extern struct MsgPort *FindPort();
extern struct Window *wBackDropOf(); /* defined later on */
/*
* ContactIconify()
*
* If we have already got a pointer to wIconify, and the new one is not
* the same as the old one, indicate that a new wIconify is running.
* Otherwise, if we found a pointer to wIconify,
* Get a reply port.
* Set up a contact message for the new wIconify, and make contact.
* Wait for a reply and then remove the port.
* If there is a version mismatch, clear the pointer to wIconify.
* Return the (possibly modified) pointer to wIconify.
*/
static void ContactIconify(NewIconPort)
struct MsgPort *NewIconPort;
{
struct wIconMessage theMessage;
struct MsgPort *thePort;
extern struct wIconMessage *WaitPort();
extern struct MsgPort *CreatePort();
if (wIconPort && NewIconPort != wIconPort)
{
NewIconPort = NEWICONIFY;
} else if (NewIconPort) {
thePort = CreatePort(NULL,0);
if (thePort)
{
theMessage.Window = NULL;
theMessage.Icon = NULL;
theMessage.Action = WI_MAKECONTACT;
theMessage.Flags = 0;
theMessage.Message.mn_ReplyPort = thePort;
theMessage.Message.mn_Length = sizeof(struct wIconMessage);
PutMsg(NewIconPort,&theMessage);
WaitPort(thePort);
DeletePort(thePort);
if (theMessage.Action != WI_VERSIONOK ||
theMessage.Data.Version.Maj < MAJLIBVERS ||
(theMessage.Data.Version.Maj == MAJLIBVERS &&
theMessage.Data.Version.Min < MINLIBVERS))
NewIconPort = NULL;
}
}
wIconPort = NewIconPort;
}
/*
* wIconifyActive()
*
* Get a pointer to the current wIconify port.
* If it's not the one we used to have, try to contact the new wIconify.
* return a success status.
*/
int wIconifyActive()
{
struct MsgPort *NewIconPort;
NewIconPort = FindPort(WICONPORT);
if (NewIconPort != wIconPort) ContactIconify(NewIconPort);
return(wIconPort && wIconPort != NEWICONIFY);
}
/*
* *SendMessage()
*
* Initializes and sends a message to wIconify. The data items are
* stored in the proper union fields, and the result from wIconify is
* returned.
*
* If wIconify is running,
* Create a reply port, and initialize the message.
* Set the data field for the proper message class.
* Send the message to wIconify and wait for the reply.
* Remove the reply port.
* Massage the return data, and return the icon.
*/
static WICONREF *SendMessage(theAction,theWindow,theIcon,Data1,Data2)
struct Window *theWindow;
WICONREF *theIcon;
long Data1,Data2;
{
struct wIconMessage theMessage;
struct MsgPort *thePort;
extern struct wIconMessage *WaitPort();
extern struct MsgPort *CreatePort();
extern APTR FindTask();
theMessage.Icon = NULL;
if (wIconifyActive())
{
thePort = CreatePort(NULL,0);
if (thePort)
{
theMessage.Window = theWindow;
theMessage.Icon = theIcon;
theMessage.Action = theAction;
theMessage.Flags = 0;
switch(theAction)
{
#ifndef WINDOW_CALLS
#ifndef ICONSETTER_CALLS
#ifndef SCREEN_CALLS
case WI_SELECTICON:
if (Data1) theMessage.Flags = WI_ADDTOSELECT;
break;
case WI_MOVEICON:
theMessage.Data.Position.x = (WORD) Data1;
theMessage.Data.Position.y = (WORD) Data2;
break;
case WI_REDRAW:
theMessage.Data.wScreen = (WSCREEN *) Data1;
break;
case WI_UPDATEICON:
theMessage.Data.Icon = (WICON *) Data1;
break;
case WI_ADDICON:
case WI_SELECTNEXT:
case WI_OPENSELECT:
case WI_CLOSESELECT:
#endif
case WI_MAKEWB:
#endif
#endif
case WI_BACKDROPOF:
theMessage.Data.Screen = (struct Screen *) Data1;
break;
#ifndef WINDOW_CALLS
#ifndef ICONSETTER_CALLS
case WI_NEWSCREEN:
theMessage.Data.NewScreen.Depth = Data1;
theMessage.Data.NewScreen.Modes = Data2;
break;
case WI_OPENON:
theMessage.Data.OpenOn.ScreenType = Data1;
theMessage.Data.OpenOn.SizeToFit = Data2;
break;
#ifdef WICONIFY_PRIVATE
case WI_ENDICONIFY:
theMessage.Data.DataPtr = FindTask(NULL);
break;
#endif
#endif
#endif
}
theMessage.Message.mn_ReplyPort = thePort;
theMessage.Message.mn_Length = sizeof(struct wIconMessage);
PutMsg(wIconPort,&theMessage);
WaitPort(thePort);
DeletePort(thePort);
}
}
if (theAction == WI_BACKDROPOF)
theMessage.Icon = (WICONREF *)theMessage.Window;
#ifndef WINDOW_CALLS
#ifndef ICONSETTER_CALLS
else if (theAction == WI_NEWSCREEN)
theMessage.Icon = (WICONREF *)theMessage.Data.Screen;
#endif
#endif
return(theMessage.Icon);
}
/*
* The remainder of the routines simply call SendMessage to send
* the appropriate message type with the appropriate data, and
* return a pointer to a wIconRef when necessary
*/
#ifndef SCREEN_CALLS
/*
* wIconify()
* wIconifyScreen()
*
* Attempt to iconify the specified window or screen (iconifying
* the backdrop window iconifies the screen).
*/
WICONREF *wIconify(theWindow)
struct Window *theWindow;
{
return(SendMessage(WI_ICONIFY,theWindow,NULL));
}
WICONREF *wIconifyScreen(theScreen)
struct Screen *theScreen;
{
return(wIconify(wBackDropOf(theScreen)));
}
/*
* wIconOf()
* wIconOfScreen()
*
* Returns the wIconRef for the icon of the specified window or screen
* (the screen icon is stored as the icon of the backdrop window).
*/
WICONREF *wIconOf(theWindow)
struct Window *theWindow;
{
return(SendMessage(WI_ICONOF,theWindow,NULL));
}
#ifndef ICONSETTER_CALLS
WICONREF *wIconOfScreen(theScreen)
struct Screen *theScreen;
{
return(wIconOf(wBackDropOf(theScreen)));
}
/*
* wRestore()
*
* Attempt to restore the window of the given wIconRef.
*/
void wRestore(theIcon)
WICONREF *theIcon;
{
SendMessage(WI_RESTORE,NULL,theIcon);
}
/*
* wGetIconData()
*
* Copy the data from the wIconRef into the wIcon structure.
* (Use with wUpdateIcon() to modify an icon).
*/
void wGetIconData(theIcon,theIconRef)
WICON *theIcon;
WICONREF *theIconRef;
{
if (theIcon && theIconRef)
Forbid(), *theIcon = theIconRef->Icon, Permit();
}
#endif
/*
* *wSetIcon()
* *wSetScreenIcon()
*
* Assign the given icon definition to the specified window or screen, and
* return the wIconRef pointer of the resulting icon.
*/
WICONREF *wSetIcon(theWindow,theIcon)
struct Window *theWindow;
WICON *theIcon;
{
return(SendMessage(WI_SETICON,theWindow,theIcon));
}
WICONREF *wSetScreenIcon(theScreen,theIcon)
struct Screen *theScreen;
WICON *theIcon;
{
return(wSetIcon(wBackDropOf(theScreen),theIcon));
}
#ifndef WINDOW_CALLS
#ifndef ICONSETTER_CALLS
/*
* wUnSetIcon()
* wUnSetScreenIcon()
*
* Clear any icon associated with the window or screen.
*/
void wUnSetIcon(theWindow)
struct Window *theWindow;
{
SendMessage(WI_UNSETICON,theWindow,NULL);
}
void wUnSetScreenIcon(theScreen)
struct Screen *theScreen;
{
wUnSetIcon(wBackDropOf(theScreen));
}
/*
* wUpdateIcon()
*
* Update the values of the wIconRef to those specified in the wIcon.
*/
void wUpdateIcon(theIcon,WIcon)
WICONREF *theIcon;
WICON *WIcon;
{
SendMessage(WI_UPDATEICON,NULL,theIcon,WIcon);
}
/*
* wSelectIcon()
*
* Attempt to select the given icon. If AddToSelect is TRUE, this is
* a multiple selection, otherwise, any previously selected items are
* deselected first.
*/
void wSelectIcon(theIcon,AddToSelect)
WICONREF *theIcon;
long AddToSelect;
{
SendMessage(WI_SELECTICON,NULL,theIcon,AddToSelect);
}
/*
* wUnSelectIcon()
*
* Make the given icon become unselected.
*/
void wUnSelectIcon(theIcon)
WICONREF *theIcon;
{
SendMessage(WI_UNSELECT,NULL,theIcon);
}
/*
* wMoveIcon()
*
* Move the icon to the specified location.
*/
void wMoveIcon(theIcon,x,y)
WICONREF *theIcon;
WORD x,y;
{
SendMessage(WI_MOVEICON,NULL,theIcon,x,y);
}
#endif
/*
* wIconXY()
*
* Gets the position of the given icon and places them in X and Y.
*/
void wIconXY(theIcon,X,Y)
WICONREF *theIcon;
WORD *X,*Y;
{
Forbid();
if (theIcon)
{
if (theIcon->Gadget)
{
*X = theIcon->Gadget->Gadget.LeftEdge;
*Y = theIcon->Gadget->Gadget.TopEdge;
} else {
*X = theIcon->Icon.x;
*Y = theIcon->Icon.y;
}
}
Permit();
}
#ifndef ICONSETTER_CALLS
/*
* wModifyFlags()
*
* Update the icon's Flags field to the given flags.
*/
void wModifyFlags(theIcon,Flags)
WICONREF *theIcon;
ULONG Flags;
{
if (theIcon)
{
Forbid();
theIcon->Icon.Flags &= WI_SYSTEMFLAGS;
theIcon->Icon.Flags |= (Flags & ~WI_SYSTEMFLAGS);
Permit();
}
}
/*
* wModifyReport()
*
* Modify the icon's Report field to the given classes.
*/
void wModifyReport(theIcon,Report)
WICONREF *theIcon;
ULONG Report;
{
if (theIcon) Forbid(), theIcon->Icon.Report = Report, Permit();
}
/*
* wRefreshIcon()
*
* Redraw all the icons on the screen containing the given icon.
*/
void wRefreshIcon(theIcon)
WICONREF *theIcon;
{
if (theIcon) SendMessage(WI_REDRAW,NULL,NULL,theIcon->Screen);
}
/*
* *wAddIcon()
*
* Add an icon (with no associated window) to the given screen.
* Returns the wIconRef for the newly created icon.
*/
WICONREF *wAddIcon(theScreen,theIcon)
struct Screen *theScreen;
WICON *theIcon;
{
return(SendMessage(WI_ADDICON,NULL,theIcon,theScreen));
}
/*
* wRemoveIcon()
*
* Remove an icon created by wAddIcon().
*/
void wRemoveIcon(theIcon)
WICONREF *theIcon;
{
SendMessage(WI_REMOVEICON,NULL,theIcon);
}
/*
* wCloseIcon()
*
* Close the window associated with a given icon.
* The same as choosing CLOSE from the ICON menu.
*/
void wCloseIcon(theIcon)
WICONREF *theIcon;
{
SendMessage(WI_CLOSEICON,NULL,theIcon);
}
/*
* wNoIconify()
*
* Mark the given window as not-iconifiable. Any attempt by the user
* to iconify the window will fail.
*/
void wNoIconify(theWindow)
struct Window *theWindow;
{
WICONREF *theIcon;
theIcon = wIconOf(theWindow);
if (theIcon == NULL) theIcon = wSetIcon(theWindow,NULL);
if (theIcon) Forbid(), theIcon->Icon.Flags |= WI_NOICONIFY, Permit();
}
/*
* wIconReport()
*
* Returns the current settings of the icon's Report field.
*/
ULONG wIconReport(theIcon)
WICONREF *theIcon;
{
ULONG Report = 0;
if (theIcon) Forbid(), Report = theIcon->Icon.Report, Permit();
return(Report);
}
#endif
#endif
#ifndef ICONSETTER_CALLS
/*
* wIconFlags()
*
* Returns the current contents of the icon's Flags field.
*/
ULONG wIconFlags(theIcon)
WICONREF *theIcon;
{
ULONG Flags = 0;
if (theIcon) Forbid(), Flags = theIcon->Icon.Flags, Permit();
return(Flags);
}
/*
* wIsIconified()
* wIsScreenIconified()
*
* Returns TRUE if the given window or screen is iconified,
* and FALSE otherwise.
*/
int wIsIconified(theWindow)
struct Window *theWindow;
{
return((wIconFlags(wIconOf(theWindow)) & WI_ICONIFIED) != FALSE);
}
int wIsScreenIconified(theScreen)
struct Screen *theScreen;
{
return(wIsIconified(wBackDropOf(theScreen)));
}
#ifndef WINDOW_CALLS
/*
* wWindowOf()
*
* Returns a pointer to the window associated with a given icon.
*/
struct Window *wWindowOf(theIcon)
WICONREF *theIcon;
{
struct Window *theWindow = NULL;
if (theIcon) Forbid(), theWindow = theIcon->Window, Permit();
return(theWindow);
}
#endif
#endif
#endif
/*
* *wBackDropOf()
*
* Returns a pointer to the wIconify window of the given screen. If there
* is no wIconify window on the screen, NULL is returned.
*/
struct Window *wBackDropOf(theScreen)
struct Screen *theScreen;
{
return((struct Window *)SendMessage(WI_BACKDROPOF,NULL,NULL,theScreen));
}
/*
* These routines are used by the wIconify utilities, such as wIconifyWindow,
* wIconScreen, wOpenOn, and wMakeWB, to do their thing. User programs
* should not use these routines, in general.
*/
#ifdef WKEYS_CALLS
/*
* wSelectNext()
*
* Attempt to select the next icon on the given screen.
*/
void wSelectNext(theScreen)
struct Screen *theScreen;
{
SendMessage(WI_SELECTNEXT,NULL,NULL,theScreen);
}
/*
* wOpenSelected()
*
* Open the selected icons on the given screen.
* Same as choosing OPEN from the ICON menu.
*/
void wOpenSelected(theScreen)
struct Screen *theScreen;
{
SendMessage(WI_OPENSELECT,NULL,NULL,theScreen);
}
/*
* wCloseSelected()
*
* Close the selected icons on the given screen.
* Same as choosing CLOSE from the ICON menu.
*/
void wCloseSelected(theScreen)
struct Screen *theScreen;
{
SendMessage(WI_CLOSESELECT,NULL,NULL,theScreen);
}
#endif
#ifdef SCREEN_CALLS
/*
* *wNewScreen()
*
* Open a new screen of the given depth an modes, and return a pointer
* to the new screen, or NULL if none created.
* (For use by wIconScreen).
*/
struct Screen *wNewScreen(Depth,Modes)
UWORD Depth,Modes;
{
return((struct Screen *)SendMessage(WI_NEWSCREEN,NULL,NULL,Depth,Modes));
}
/*
* wMakeWB()
*
* Change the current WB screen to the given screen.
* (For use by wMakeWB).
*/
void wMakeWB(theScreen)
struct Screen *theScreen;
{
SendMessage(WI_MAKEWB,NULL,NULL,theScreen);
}
/*
* wSetOpenOn()
*
* Set the OpenOn submenu to the specified type of window and sizing option.
* (For use by wOpenOn).
*/
void wSetOpenOn(ScreenType,SizeToFit)
int ScreenType,SizeToFit;
{
SendMessage(WI_OPENON,NULL,NULL,ScreenType,SizeToFit);
}
#endif
#ifdef WICONIFY_PRIVATE
/*
* wEndIconify()
*
* Ask wIconify to terminate. This is for the internal use of wIconify ONLY!
*/
APTR wEndIconify()
{
return((APTR)SendMessage(WI_ENDICONIFY,NULL,NULL));
}
#endif